import { _decorator, Asset, AssetManager, AudioClip, AudioSource, Component, error, JsonAsset, Label, Node, Prefab, ProgressBar, resources, SpriteFrame, tween, v3, view } from 'cc';
import { UIRoot } from './UIRoot';
import { PrefabPath } from './Configs';
import { UIBase } from './UIBase';
import { AudioMgr, JsonMgr, PrefabMgr, SpecialResMgr, SpriteFrameMgr } from './Res/SpecialResMgr';
import { resMgr } from './Res/ResMgr';
const { ccclass, property } = _decorator;

@ccclass('UILoading')
export class UILoading extends UIBase {
    /**
     * type:属性的类型
     * displayName属性公布后在属性面板上的名字，
     * tooltip:光标停留在此属性上会显示的提示信息
     * 当属性命名有下滑线时，表示是私有属性，不能在属性面板上被看见，此时需要将这个属性的visible值设置为true
     */
    @property({ type: ProgressBar, displayName: "加载进度条", tooltip: "提示信息", visible: true })
    _progessBar: ProgressBar = null;
    @property(Label)
    progressLabel: Label = null;


    start() {
        //第二个参数处为null，是规定了如果要加载多种的资源类型，则类型处就写null，如果有具体的类型就写具体资源类型
        resources.loadDir("", null, (finished: number, total: number, item: AssetManager.RequestItem) => {
            let progess = finished / total;
            this._progessBar.progress = this._progessBar.progress > progess ? this._progessBar.progress : progess;
            this.progressLabel.string = `${(this._progessBar.progress * 100).toFixed(2)}%`
        }, (err: Error, assets: Asset[]) => {
            if (err) {
                error("资源加载失败");
                return;
            }

            let mgrObj = {
                "PrefabMgr": PrefabMgr,
                "SpriteFrameMgr": SpriteFrameMgr,
                "AudioMgr": AudioMgr,
                "JsonMgr": JsonMgr
            }

            //将创建的管理者放入存储管理者的容器中
            for (let mgr in mgrObj) {
                let objMgr = new mgrObj[mgr]();
                resMgr.addMgr(mgr, objMgr);
            }
            let objType = {
                "PrefabMgr": Prefab,
                "SpriteFrameMgr": SpriteFrame,
                "AudioMgr": AudioClip,
                "JsonMgr": JsonAsset
            }

            //遍历加载的资源
            for (let res of assets) {
                //遍历管理各类资源的管理者
                for (let mgrName in mgrObj) {
                    if (res instanceof objType[mgrName]) {
                        //将资源存储到对应类型的管理者存储资源的容器中
                        resMgr.getMgr<SpecialResMgr>(mgrName).addRes(res.name, res);
                        break;
                    }
                }
            }
            console.log(resMgr);
            tween(this.node)
                .to(0.2, { position: v3(view.getDesignResolutionSize().width, 0, 0) })
                .call(() => {
                    UIRoot.instance.openUI("Menu");
                    UIRoot.instance.closeUI("UILoading");
                })
                .start()

        })

    }

    update(deltaTime: number) {
    }
}


